// utils/payUtil.js
const baseUrl = 'http://localhost:8080';

/**
 * 封装支付流程
 * @param {Object} orderInfo - 套餐信息
 * @param {Function} setQrCode - 设置二维码的回调函数
 * @param {Function} onSuccess - 支付成功的回调函数
 */
export const createPayment = (orderInfo, setQrCode, onSuccess, onTimerSet) => {
  const { orderName, orderPrice, orderNumber } = orderInfo;
  const subject = orderName;
  const outTradeNo = orderNumber;
  const totalAmount = parseInt(parseFloat(orderPrice));

  wx.request({
    url: `${baseUrl}/alipay/pay`,
    method: 'GET',
    responseType: 'arraybuffer',
    data: { subject, outTradeNo, totalAmount },
    success: (res) => {
      if (res.statusCode === 200) {
        try {
          // 1. 生成二维码
          const base64 = wx.arrayBufferToBase64(res.data);
          const qrCodeUrl = `data:image/png;base64,${base64}`;
          setQrCode(qrCodeUrl); // 更新页面二维码

          // 设置30秒超时关闭轮询
          const timeoutId = setTimeout(() => {
            clearInterval(intervalId);
            wx.showToast({ title: '支付超时', icon: 'none' });
          }, 30000); // 30秒超时

          // 3. 轮询支付状态
          const intervalId = setInterval(() => {
            wx.request({
              url: `${baseUrl}/alipay/queryPay`,
              data: { outTradeNo },
              success: (queryRes) => {
                if (queryRes.data === 'TRADE_SUCCESS') {
                  clearInterval(intervalId);
                  clearTimeout(timeoutId);
                  onSuccess(queryRes.data); // 支付成功回调
                }
              },
              fail: (queryErr) => {
                clearInterval(intervalId);
                clearTimeout(timeoutId);
                console.error('支付状态查询失败:', queryErr);
              }
            });
          }, 3000);

          // 返回定时器ID给页面
          onTimerSet?.(intervalId, timeoutId);
        } catch (error) {
          console.error('二维码处理失败:', error);
          wx.showToast({ title: '支付码生成失败', icon: 'none' });
        }
      } else {
        wx.showToast({ title: '支付请求失败', icon: 'none' });
      }
    },
    fail: (err) => {
      console.error('网络请求失败:', err);
      wx.showToast({ title: '网络连接失败', icon: 'none' });
    }
  });
};